# Full Report
This report uses data from an off-premise liquor store in a small up-market shopping centre called Saporium in Rosebery, NSW Australia.
Rosebery has a population of approximately 10,000 with a median age of 33 and 2,500 families. The median weekly income is $1,900 and weekly rent is $580. 34% of residents have a university or tertiary education which is twice that of NSW average and 67% work full-time. 58% of the population live in flats or apartments. The suburb has a diverse mix of cultures with Chinese and Greek ancestory heavily over-represented compared to the NSW Average. 63% of the population’s parents were both born overseas, just under double the NSW average. Eastern orthodox over-represented and Anglican under-represented.(ABS, 2016)
This report looks at the effect of weather on alcohol sales in the hope of improving the likelihood of small business success. Lots of small businesses fail due to incorrect product placement, marketing or pricing. A business’s core role is to provide goods and services. Their success is dependent on their ability to sell products for revenues. It is therefore imperative that they 1. stock the correct product 2. Market the correct product 3. Price their products effectively In the past, these decisions have been the intuition of a good business operator however with the accessibility of data and analytics tools we can now take a more scientific approach which can be replicated by any business.
There is a wealth of evidence that shows that weather influences consumer behaviour and understanding this leads to better marketing decisions (Murray et al, 2010). The key areas of consumer behaviour this report will address are what conditions weather effects consumer spending and what conditions effect consumer behaviour.
Weather is defined as ______. Researchers indicate that weather alters the shoppers mood.
Research indicates that weather can effect consumer spending in three ways 1. Bad weather keeps people at home reducing foot traffic and sales 2. Weather can influence store traffic and sales volume, and 3. Weather can influence sales by affecting the customers internal state.
We will use this report to show small businesses how they can use their data to increase profitability by making informed decisions about stocking, marketing and pricing their products, helping them find the signal in the noise.
# LOAD DATA
library(ggplot2)
library(tidyr)
library(xtable)
library(knitr)
data = read.csv("data/ProcessedData.csv")
# Quick look at top 6 rows of data
head(data)
## X Date Receipt.Number Quantity Subtotal Sales.Tax Total Paid
## 1 0 2018-08-06 18179 1 24.55 2.45 27.00 NA
## 2 4 2018-08-06 18178 2 21.82 2.18 24.00 NA
## 3 7 2018-08-06 18177 3 42.73 4.27 47.00 NA
## 4 11 2018-08-06 18176 1 24.55 2.45 27.00 NA
## 5 16 2018-08-06 18175 5 28.23 2.82 31.05 NA
## 6 21 2018-08-06 18174 1 30.90 3.09 33.99 NA
## Details
## 1 1 X Cirillo Rose
## 2 2 X Fever Tree Elderflower Tonic 4pk
## 3 2 X Ps40 Smoked Lemonade + 1 X Athletes of Wine Vino Athletico Macedon Pinot noir
## 4 1 X Empty Wine Bottle 750ml + 1 X Unico Zelo Harvest Sauvignon Blanc KEG + -1 X Discount
## 5 3 X Frenchies Kolsch 330ml + 3 X Frenchies Comet Pale Ale 330ml + -1 X Discount
## 6 1 X Domaine Thomson - Explorer Pinot Noir
## Time Maximum.temperature..Degree.C. Rainfall.amount..millimetres.
## 1 18:42:40 19 0
## 2 18:03:54 19 0
## 3 17:45:58 19 0
## 4 17:32:56 19 0
## 5 16:26:31 19 0
## 6 15:05:09 19 0
## Size of data
dim(data)
## [1] 11870 12
## R's classification of data
class(data)
## [1] "data.frame"
## R's classification of variables
str(data)
## 'data.frame': 11870 obs. of 12 variables:
## $ X : int 0 4 7 11 16 21 24 34 37 40 ...
## $ Date : Factor w/ 404 levels "2017-06-24","2017-06-25",..: 404 404 404 404 404 404 404 404 404 404 ...
## $ Receipt.Number : Factor w/ 11870 levels "10000","10001",..: 8108 8107 8106 8105 8104 8103 8102 8101 8100 8079 ...
## $ Quantity : num 1 2 3 1 5 1 5 1 1 3 ...
## $ Subtotal : num 24.6 21.8 42.7 24.6 28.2 ...
## $ Sales.Tax : num 2.45 2.18 4.27 2.45 2.82 3.09 2.82 3.27 1.82 2.49 ...
## $ Total : num 27 24 47 27 31.1 ...
## $ Paid : logi NA NA NA NA NA NA ...
## $ Details : Factor w/ 6558 levels "-1 X Adelaide Hills Distillery Dry Vermouth",..: 1075 5396 5594 1609 5787 1435 2251 1095 4873 3352 ...
## $ Time : Factor w/ 9974 levels "00:28:37","01:26:38",..: 8960 8071 7704 7424 6144 4551 3576 3415 3006 2451 ...
## $ Maximum.temperature..Degree.C.: num 19 19 19 19 19 19 19 19 19 19 ...
## $ Rainfall.amount..millimetres. : num 0 0 0 0 0 0 0 0 0 0 ...
#sapply(mtcars, class)
The dataset contains 11870 sales where each row represents 1 sale. Summary:
Complexity of data: We are looking at a dataset with len(names())
How does the maximum temperature affect the consumer decision when purcahsing alcohol?
Insert text and analysis.
Lets start at looking at how much a person spends in the store on average. The number we see inside each bar represents the number of transactions for that temperature category and the line in each bar represent the median of money spent. As we can see from the chart, people seem to spend more money in milder temperature (15 - 40 degrees) but in more extreme temperatures (10 - 15 and 40 - 45 degrees) people tend to buy less alcohol. We can also observe that people tend to spend more money when the temperature is between 35 and 40 degrees.
#The temperature is a quantitative variable. We start by changing it to a qualitative one using ranges that cover 5 degrees Celcius
temp = data$Maximum.temperature..Degree.C.
data$tempGroups = cut(temp, c(10,15,20,25,30,35,40,45))
#Take a look at overall data before looking at the graphs
heatData = data %>% drop_na(Maximum.temperature..Degree.C.)
dataFrame <- data.frame(Rows = c(nrow(data)-nrow(heatData)),
Max = c(max(temp)),
Min = c(min(temp)),
Mean = c(mean(temp)),
Median = c(median(temp)))
kable(dataFrame, caption = "Fuck yeah", col.names = c("Missing rows", "Max heat", "Min heat", "Mean maximum heat", "Median of maximum heat"))
| Missing rows | Max heat | Min heat | Mean maximum heat | Median of maximum heat |
|---|---|---|---|---|
| 0 | 43.4 | 14.3 | 23.28904 | 23.2 |
#Transaction sizes for each temperature range
meanPerPerson = aggregate(data$Total ~ data$tempGroups, data, mean)
medPerPerson = aggregate(data$Total ~ data$tempGroups, data, median)
transactions = merge(x = meanPerPerson, y = medPerPerson, by='data$tempGroups')
names(transactions) = c('Temperature', 'Mean_total', 'Median_total')
Fre <- as.data.frame(table(data$tempGroups))
colnames(Fre)[1] <- "tempGroups"
Fre$lab <- as.character(Fre$Freq)
#Barplot for average money spent with median lines
ggplot(transactions, aes(Temperature, Mean_total), label = Fre$Freq) + geom_bar(stat="identity", position = "dodge", fill = "#FF6666") + ggtitle("Average money spent (in dollars) per purchase for different temperature") + ylab("Dollars") + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + geom_errorbar(data=transactions, aes(Temperature, ymax = Median_total, ymin = Median_total), size=1, linetype = "solid", inherit.aes = F, width = 0.9) + geom_text(aes(label = Fre$Freq), position = position_dodge(width = 0.9), vjust = 1.5) + scale_x_discrete(labels = c('10 - 15','15 - 20','20 - 25', '25 - 30', '30 - 35', '35 - 40', '40 - 45'))
#Barplot showing only median
#ggplot(transactions, aes(Temperature, Median_total)) + geom_bar(stat="identity", position = "dodge", fill = "#56B4E9") + ggtitle("Median how much each person spends (in dollars) for different temperature") + ylab("Median") + theme_bw() + theme(plot.title = element_text(hjust = 0.5))
#ggplot(data, aes(Maximum.temperature..Degree.C., median(Total)), group = 1) + geom_boxplot() + coord_flip()
#Number of transactions per temperature range
#barplot(table(data$tempGroups))
Lets look at what an average day looks like in total sales for each temperature range. This seems to back up what we where saying before. That in extreme temperature (10 - 15 and 40 - 45 degrees) people seem to buy less alcohol while in milder temperatures people seem to buy alot. We also see the spike again when the temperature is between 35 - 40 degrees.
#Total money spent for each temperature range
totalPerDay = aggregate(data$Total ~ data$tempGroups, data, sum)
nrOfDaysPerTemp = aggregate(data$Date ~ data$tempGroups, data, function(x) length(unique(x)))
totals = merge(x = totalPerDay, y = nrOfDaysPerTemp, by='data$tempGroups')
names(totals) = c('Temperature', 'Total', 'NrOfDays')
totals['meanPerDay'] = round(totals$Total / totals$NrOfDays, 1)
ggplot(totals, aes(Temperature, meanPerDay)) + geom_bar(stat="identity", position = "dodge") + geom_bar(stat="identity", position = "dodge", fill = "#56B4E9") + ggtitle("Average money spent (dollars) in one day for different temperature") + ylab("Dollars") + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + scale_x_discrete(labels = c('10 - 15','15 - 20','20 - 25', '25 - 30', '30 - 35', '35 - 40', '40 - 45'))
Summary: Looking at the values of the median and mean purchase transactions we see that there is not much change in consumer behaviour over the temperature ranges 15-35 degrees. However the more extreme temperature values have more of an effect. During the coldest times (10-15 degrees) there is a definate drop in amount of money spent per purchase. During the very hottest periods 40-45 degrees there is also a massive drop in amount spent on each transaction. However it is worth noting that there were very few transactions during that time. Another very interesting spike in sales occured at the 35-40 temperature range. This could be because people drink more alcohol, however these would be regular temperatures during Christamas time when people are on vacation and drink more alcohol in general.
How does rainfall affect the consumer decision when purchasing alcohol?
Insert text and analysis.
There are a few days for which we do not have rain data so we start by removing those rows. We then take a better look at the rain data Let’s start by taking a better look at the rainfall data
rainData = data %>% drop_na(Rainfall.amount..millimetres.)
rain = rainData$Rainfall.amount..millimetres.
dataFrame <- data.frame(Rows = c(nrow(data)-nrow(rainData)),
Max = c(max(rain)),
Min = c(min(rain)),
Mean = c(mean(rain)),
Median = c(median(rain)))
kable(dataFrame, caption = "Fuck yeah", col.names = c("Missing rows", "Max rainfall", "Min rainfall", "Mean rainfall", "Median of rainfall"))
| Missing rows | Max rainfall | Min rainfall | Mean rainfall | Median of rainfall |
|---|---|---|---|---|
| 74 | 69.4 | 0 | 1.665683 | 0 |
#We start by changing the rainfall from a quantitative variable to a qualitative one
rainData$rainGroups = cut(rain, c(0,0.1,5,15,40,70), include.lowest = TRUE)
#Transaction sizes for each temperature range
meanPerPerson = aggregate(rainData$Total ~ rainData$rainGroups, rainData, mean)
medPerPerson = aggregate(rainData$Total ~ rainData$rainGroups, data, median)
transactions = merge(x = meanPerPerson, y = medPerPerson, by='rainData$rainGroups')
names(transactions) = c('Rainfall', 'Mean_total', 'Median_total')
FreRain <- as.data.frame(table(rainData$rainGroups))
colnames(Fre)[1] <- "rainGroups"
FreRain$lab <- as.character(FreRain$Freq)
#Barplot for average money spent with median lines
ggplot(transactions, aes(Rainfall, Mean_total), label = FreRain$lab) + geom_bar(stat="identity", position = "dodge", fill = "#FF6666") + ggtitle("Average money spent (in dollars) per purchase for different rainfall") + ylab("Dollars") + xlab("Rainfall (mm)") + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + geom_errorbar(data=transactions, aes(Rainfall, ymax = Median_total, ymin = Median_total), size=1, linetype = "solid", inherit.aes = F, width = 0.9) + geom_text(aes(label = FreRain$lab), position = position_dodge(width = 0.9), vjust = 1.5) + scale_x_discrete(labels = c('0','0 - 5','5 - 15', '15 - 40', '40 - 70'))
#ggplot(transactions, aes(Rainfall, Mean_total)) + geom_bar(stat="identity", position = "dodge")
ggplot(transactions, aes(Rainfall, Median_total)) + geom_bar(stat="identity", position = "dodge")
#Number of transactions for each rainfall range
barplot(table(rainData$rainGroups))
#Total money spent for each temperature range
totalPerDay = aggregate(rainData$Total ~ rainData$rainGroups, rainData, sum)
nrOfDaysPerRain = aggregate(rainData$Date ~ rainData$rainGroups, rainData, function(x) length(unique(x)))
totals = merge(x = totalPerDay, y = nrOfDaysPerRain, by='rainData$rainGroups')
names(totals) = c('Rainfall', 'Total', 'NrOfDays')
totals['meanPerDay'] = round(totals$Total / totals$NrOfDays, 1)
ggplot(totals, aes(Rainfall, meanPerDay)) + geom_bar(stat="identity", position = "dodge")
Insert text and analysis.
Summary:
How does the time of year affect the consumer decision when purchasing alcohol?
Other possible research questions: What time of day do people buy their alcohol?
Insert text and analysis.
Summary:
TODO:
Insert text.
Style: APA
This quick reference guide will cover some basic RMarkdown for use in your projects.
Here is a basic list:
To do 1
To do 2
To do 3
Here is a simple table.
| Tables | Are | Cool |
|---|---|---|
| col 3 is | right-aligned | $1600 |
| col 2 is | centered | $12 |
| zebra stripes | are neat | $1 |
Here is am image. It has not been adjusted in the rmd file, so represents the true size of the original image. This image is sourced directly from an online url.
To learn more about adding images directly from your own computer, see the comments in this rmd file.
Image source: https://petcube.com/blog/10-all-important-kitten-supplies-infographic/
Below you will find a video embedded into your RMarkdown file. Change the YouTube link in the rmd file to get a different video.
You can even use LaTeX in an RMarkdown document!
For example, how could you work out \(\sum_{i=1}^{5} x_{i}^3\)?
Here is an R code chunk:
Try the following commands in R.
1+ exp(3) + sin(0.5)
x=c(1,2,3)
x^2
sum(x)
Here is some in-line code in-line code. You can put any R code here for display, e.g. sum(x)
Check out the resources below for more information on RMarkdown.